package com.eber.demo.design.order;

/**
 * 类的实例化顺序
 * 1. 执行静态块
 * 2. 执行构造代码块
 * 3. 执行构造器
 *
 * 类中的实例成员，等价于构造代码块
 * 类中的静态成员，等价于静态块
 */

class Foo {
    int a = f1();

    static int b = f2();

    public int f1() {
        System.out.println("1");
        return 5;
    }

    public static int f2() {
        System.out.println("2");
        return 10;
    }

    public Foo() {
        System.out.println("3");
    }
}

public class OrderApplication {
    /*public static void main(String[] args) {
        new Foo();
    }*/
    public static void main(String[] args) {
        OrderApplication.f1();                                  // 9 执行main函数
    }
    static OrderApplication t = new OrderApplication();         // 1 执行静态代码块,执行new,所以先构造
    static {
        System.out.println("1");                                // 7 完成[1]的构造,继续执行静态代码块
    }
    {
        System.out.println("2");                                // 2 执行构造代码块
    }
    OrderApplication() {                                        // 4 执行构造函数
        System.out.println("3");                                // 5 执行
        System.out.println("a=" + a + ",b=" + b);               // 6 执行，1=110，b=0
    }
    public static void f1() {
        System.out.println("4");                                // 10 执行函数
        System.out.println("a=" + t.a + ",b=" + b);             // 11 执行，1=110，b=112
    }
    int a = 110;                                                // 3 执行构造代码块
    static int b = 112;                                         // 8 继续执行静态代码块
}
